package org.mianshi.likou.top150;

/**
 * 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
 *
 * 假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
 *
 * 更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
 * 返回 k。
 * 用户评测：
 *
 * 评测机将使用以下代码测试您的解决方案：
 *
 * int[] nums = [...]; // 输入数组
 * int val = ...; // 要移除的值
 * int[] expectedNums = [...]; // 长度正确的预期答案。
 *                             // 它以不等于 val 的值排序。
 *
 * int k = removeElement(nums, val); // 调用你的实现
 *
 * assert k == expectedNums.length;
 * sort(nums, 0, k); // 排序 nums 的前 k 个元素
 * for (int i = 0; i < actualLength; i++) {
 *     assert nums[i] == expectedNums[i];
 * }
 * 如果所有的断言都通过，你的解决方案将会 通过。
 *
 *
 *
 * 思路：双指针，一个指针用于前进，寻找不等val的元素，一个元素用于保留位置。 如果遇到了目标元素，则指针1记录位置，指针2一直遍历。
 */
public class 移除元素27 {

    public static void main(String[] args) {
        int[]arr = {0,1,2,2,3,0,4,2};
        removeElement(arr,2);
    }


    public static int removeElement(int[] nums, int val) {
        int index1 = 0;
        int index2 = 0;
        int repeateNum=0;
        while(index2<nums.length){
            if(nums[index2]==val){
                index2++;
            }else{
                repeateNum++;
                nums[index1]=nums[index2];
                index1++;
                index2++;
            }
        }
        for (int s : nums) {
            System.out.println(s);
        }
        return repeateNum;
    }

    class Solution {
        public int removeElement(int[] nums, int val) {
            int index1 = 0;
            int index2 = 0;
            int repeateNum=0;
            while(index2<nums.length){
                if(nums[index2]==val){
                    index2++;
                }else{
                    repeateNum++;
                    nums[index1]=nums[index2];
                    index1++;
                    index2++;
                }
            }

            return repeateNum;
        }

        //方式2：
        public int removeElement2(int[] nums, int val) {
            int index1 = 0;
            int repeateNum = 0;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] != val) {
                    nums[index1] = nums[i];
                    index1++;
                    repeateNum++;
                }
            }

            return repeateNum;
        }
    }
}
